package com.fpmsa.officeweb.controller;

import com.alibaba.fastjson.JSON;
import com.fpmsa.officeweb.constant.OWConstant;
import com.fpmsa.officeweb.core.exception.BizExceptionEnum;
import com.fpmsa.officeweb.core.exception.GunsException;
import com.fpmsa.officeweb.core.util.ToolUtil;
import com.fpmsa.officeweb.model.MemberMien;
import com.fpmsa.officeweb.model.News;
import com.fpmsa.officeweb.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Auther: Huang Yuehong
 * @Description:
 * @Date: 2018/6/20 13:44
 */
@Controller
@RequestMapping("/webnews")
public class WebnewsController {

    @Autowired
    private INewsService newsService;

    @Autowired
    private INewsCategoryService newsCategoryService;

    @Autowired
    private OfficeWebService officeWebService;

    @Autowired
    private IMemberMienService memberMienService;

    private String PREFIX = "/templates/webnews/";

    /**
     * 跳转到"通知公告"页面
     */
    @RequestMapping("/anounce")
    public String anounce(HttpServletRequest request, Model model) {

        // 获取新闻列表（类别为“通知公告”）,按时间降序排列
        List<News> anounceList = officeWebService.getNewsList(OWConstant.OW_ANOUNCEMENT,OWConstant.OW_SHOW_NEWS_NUM,false);
        List<Map<String,Object>> anounceMapList = officeWebService.formatCreateTime(anounceList,"yyyy-MM-dd");
        model.addAttribute("anounceMapList", anounceMapList);

        // 用来判断页面上将左边选中的菜单文字设置成蓝色（class=on）
        model.addAttribute("flagname",OWConstant.OW_ANOUNCEMENT);

        Integer countNews = newsService.getCountOfCategory(OWConstant.OW_ANOUNCEMENT);
        if (countNews > OWConstant.OW_SHOW_NEWS_NUM){
            model.addAttribute("isShowMore",1);//表示页面显示“点击查看更多”按钮
        }else{
            model.addAttribute("isShowMore",0);//不显示
        }

        // category放到前台作为“浏览更多”方法的参数
        model.addAttribute("category",newsCategoryService.getIdByName(OWConstant.OW_ANOUNCEMENT));

        // 往页面的model对象里面添加“关键词”、“描述”、“title”、下拉框选项等属性,用request判断请求的来源（pc/移动端/微信端）
        officeWebService.addAttrForModel(request,model);

        return PREFIX + "news_anounce.html";
    }



    /**
     * 跳转到协会新闻页面
     */
    @RequestMapping("")
    public String webnews(HttpServletRequest request,Model model) {

        // 获取新闻列表（类别为“协会新闻”）,按时间降序排列
        List<News> newsList = officeWebService.getNewsList(OWConstant.OW_ASSOCIATION_NEWS,OWConstant.OW_SHOW_NEWS_NUM,false);
        // 转换create_time字段，拆分为“年”和“月日”两部分，其余属性不变，用于前台新闻列表显示
        List<Map<String,Object>> newsMapList = newsService.formatCreateTime(newsList);
        model.addAttribute("newsMapList",newsMapList);

        // 用来判断页面上将左边选中的菜单文字设置成蓝色（class=on）
        model.addAttribute("flagname",OWConstant.OW_ASSOCIATION_NEWS);

        Integer countNews = newsService.getCountOfCategory(OWConstant.OW_ASSOCIATION_NEWS);
        if (countNews > OWConstant.OW_SHOW_NEWS_NUM){
            model.addAttribute("isShowMore",1);//表示页面显示“点击查看更多”按钮
        }else{
            model.addAttribute("isShowMore",0);//不显示
        }

        // category放到前台作为“浏览更多”方法的参数
        model.addAttribute("category",newsCategoryService.getIdByName(OWConstant.OW_ASSOCIATION_NEWS));

        // 往页面的model对象里面添加“关键词”、“描述”、“title”、下拉框选项等属性,用request判断请求的来源（pc/移动端/微信端）
        officeWebService.addAttrForModel(request,model);

        return PREFIX + "news.html";
    }

    /**
     * 跳转到媒体报道页面
     */
    @RequestMapping("/media")
    public String media(HttpServletRequest request,Model model) {

        // 获取新闻列表（类别为“媒体报道”）
        List<News> mediaList = officeWebService.getNewsList(OWConstant.OW_MEDIA_REPORT,OWConstant.OW_SHOW_NEWS_NUM,false);
        // 转换create_time字段，拆分为“年”和“月日”两部分，其余属性不变，用于前台新闻列表显示
        List<Map<String,Object>> mediaMapList = newsService.formatCreateTime(mediaList);
        model.addAttribute("mediaMapList", mediaMapList);

        // 用来判断页面上将左边选中的菜单文字设置成蓝色（class=on）
        model.addAttribute("flagname",OWConstant.OW_MEDIA_REPORT);

        Integer countNews = newsService.getCountOfCategory(OWConstant.OW_MEDIA_REPORT);
        if (countNews > OWConstant.OW_SHOW_NEWS_NUM){
            model.addAttribute("isShowMore",1);//表示页面显示“点击查看更多”按钮
        }else{
            model.addAttribute("isShowMore",0);//不显示
        }

        // category放到前台作为“浏览更多”方法的参数
        model.addAttribute("category",newsCategoryService.getIdByName(OWConstant.OW_MEDIA_REPORT));

        // 往页面的model对象里面添加“关键词”、“描述”、“title”、下拉框选项等属性,用request判断请求的来源（pc/移动端/微信端）
        officeWebService.addAttrForModel(request,model);

        return PREFIX + "news_media.html";
    }

    /**
     * 跳转到行业资讯页面
     */
    @RequestMapping("/info")
    public String info(HttpServletRequest request,Model model) {

        // 获取新闻列表（类别为“行业资讯”）,按时间降序排列
        List<News> infoList = officeWebService.getNewsList(OWConstant.OW_PROFESSION_INFO,OWConstant.OW_SHOW_NEWS_NUM,false);
        List<Map<String,Object>> infoMapList = officeWebService.formatCreateTime(infoList,"yyyy-MM-dd");
        model.addAttribute("infoMapList", infoMapList);

        // 用来判断页面上将左边选中的菜单文字设置成蓝色（class=on）
        model.addAttribute("flagname",OWConstant.OW_PROFESSION_INFO);

        Integer countNews = newsService.getCountOfCategory(OWConstant.OW_PROFESSION_INFO);
        if (countNews > OWConstant.OW_SHOW_NEWS_NUM){
            model.addAttribute("isShowMore",1);//表示页面显示“点击查看更多”按钮
        }else{
            model.addAttribute("isShowMore",0);//不显示
        }

        // category放到前台作为“浏览更多”方法的参数
        model.addAttribute("category",newsCategoryService.getIdByName(OWConstant.OW_PROFESSION_INFO));

        // 往页面的model对象里面添加“关键词”、“描述”、“title”、下拉框选项等属性,用request判断请求的来源（pc/移动端/微信端）
        officeWebService.addAttrForModel(request,model);

        return PREFIX + "news_info.html";
    }


    /**
     * 跳转到政策法规页面
     */
    @RequestMapping("/law")
    public String law(HttpServletRequest request,Model model) {

        // 获取新闻列表（类别为“政策法规”）,按时间降序排列
        List<News> lawList = officeWebService.getNewsList(OWConstant.OW_LAWS_REGULATIONS,OWConstant.OW_SHOW_NEWS_NUM,false);
        //model.addAttribute("lawList",lawList);
        // 转换create_time字段，拆分为“年”和“月日”两部分，其余属性不变，用于前台新闻列表显示
        List<Map<String,Object>> lawMapList = officeWebService.formatCreateTime(lawList,"yyyy-MM-dd");
        model.addAttribute("lawMapList", lawMapList);

        // 用来判断页面上将左边选中的菜单文字设置成蓝色（class=on）
        model.addAttribute("flagname",OWConstant.OW_LAWS_REGULATIONS);

        Integer countNews = newsService.getCountOfCategory(OWConstant.OW_LAWS_REGULATIONS);
        if (countNews > OWConstant.OW_SHOW_NEWS_NUM){
            model.addAttribute("isShowMore",1);//表示页面显示“点击查看更多”按钮
        }else{
            model.addAttribute("isShowMore",0);//不显示
        }

        // category放到前台作为“浏览更多”方法的参数
        model.addAttribute("category",newsCategoryService.getIdByName(OWConstant.OW_LAWS_REGULATIONS));

        // 往页面的model对象里面添加“关键词”、“描述”、“title”、下拉框选项等属性,用request判断请求的来源（pc/移动端/微信端）
        officeWebService.addAttrForModel(request,model);

        return PREFIX + "news_law.html";
    }


    /**
     * 跳转到视频中心页面
     */
    @RequestMapping("/vedio")
    public String vedio(HttpServletRequest request,Model model) {

        // 获取新闻列表（类别为“视频中心”）
        List<News> vedioList = officeWebService.getNewsList(OWConstant.OW_VEDIO_CENTER,OWConstant.OW_SHOW_NEWS_NUM,false);
        // 转换create_time字段，拆分为“年”和“月日”两部分，其余属性不变，用于前台新闻列表显示
        List<Map<String,Object>> vedioMapList = newsService.formatCreateTime(vedioList);
        model.addAttribute("vedioMapList", vedioMapList);

        // 用来判断页面上将左边选中的菜单文字设置成蓝色（class=on）
        model.addAttribute("flagname",OWConstant.OW_VEDIO_CENTER);

        Integer countNews = newsService.getCountOfCategory(OWConstant.OW_VEDIO_CENTER);
        if (countNews > OWConstant.OW_SHOW_NEWS_NUM){
            model.addAttribute("isShowMore",1);//表示页面显示“点击查看更多”按钮
        }else{
            model.addAttribute("isShowMore",0);//不显示
        }

        // category放到前台作为“浏览更多”方法的参数
        model.addAttribute("category",newsCategoryService.getIdByName(OWConstant.OW_VEDIO_CENTER));

        // 往页面的model对象里面添加“关键词”、“描述”、“title”、下拉框选项等属性,用request判断请求的来源（pc/移动端/微信端）
        officeWebService.addAttrForModel(request,model);

        return PREFIX + "news_vedio.html";
    }


    /**
     * 跳转到新闻详情页面
     */
    @RequestMapping("/detail/{webnewsId}/{category}")
    public String detail(@PathVariable Long webnewsId,@PathVariable Long category,HttpServletRequest request, Model model) {

        if (ToolUtil.isOneEmpty(webnewsId,category)) {
            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
        }

        if (!ToolUtil.isNum(webnewsId) || !ToolUtil.isNum(category)){
            throw new GunsException(BizExceptionEnum.REQUEST_PARA_ERROR);
        }

        String categoryName = newsCategoryService.selectById(category).getName();
        if (categoryName.equals(OWConstant.OW_VEDIO_CENTER)){
            model.addAttribute("isVedio",1);
        }else{
            model.addAttribute("isVedio",0);
        }

        if (categoryName.equals(OWConstant.OW_ANOUNCEMENT)){
            model.addAttribute("isAnounce",1);
        }else{
            model.addAttribute("isAnounce",0);
        }

        News news = newsService.selectById(webnewsId);
        if (news != null){
            if (categoryName.equals(OWConstant.OW_VEDIO_CENTER)){
                // 去掉ueditor自动给视频地址添加的p标签
                news.setContent(news.getContent().replace("<p>","").replace("</>",""));
                model.addAttribute("webnews",news);
            }
            model.addAttribute("webnews",news);
            model.addAttribute("date",new SimpleDateFormat("yyyy年MM月dd日").format(news.getCreateTime()));
        }

        // 统计新闻的阅读数，每点击一次加一次的阅读数
        news.setReadtimes(news.getReadtimes() + 1);
        news.updateById();

        // 获取num条会员风采到新闻详情页右侧(按排序值orderval升序排序)
        List<MemberMien> mmList = memberMienService.getNumMMs(2,true);
        model.addAttribute("mmList",mmList);

        // 获取num条类型相同的相关新闻(排除当前新闻)
        List<News> relatedsList = newsService.getRelatedNews(3,false,news.getId(),category);
        model.addAttribute("relatedsList",relatedsList);

        // 获取当前新闻的下一条(注意：日期格式化中HH表示24小时制，hh是12小时制，如果mysql中是24小时制，这里用12小时制做对比，就会出现错误)
        News nextNews = newsService.getNextNews(news.getCreateTime(),category);
        model.addAttribute("nextNews",nextNews);

        // 往页面的model对象里面添加“关键词”、“描述”、“title”、下拉框选项等属性,用request判断请求的来源（pc/移动端/微信端）
        officeWebService.addAttrForModel(request,model);

        return PREFIX + "news_detail.html";
    }


    /**
     * 搜索出来的新闻列表(“浏览更多”功能),10条逐步增加
     */
    @RequestMapping("/loadMoreSearchs/{condition}/{newsId}")
    @ResponseBody
    public String loadMoreSearchs(@PathVariable String condition,@PathVariable Long newsId){

        News news = newsService.selectById(newsId);
        HashMap<String,Object> map = new HashMap<>();

        // 获取页面最后一条新闻之前的num条其他新闻（用时间比对）
        List<News> newsList = newsService.getNewsBeforeTimes(null,condition,news.getCreateTime(),OWConstant.OW_SHOW_LOADMORE_NUM,false);

        // 获取页面最后一条新闻之前的所有其他新闻（用时间比对）
        List<News> newsList1 = newsService.getNewsBeforeTimes(null,condition,news.getCreateTime(),null,false);

        // 搜索出来的新闻“浏览更多”时，需要将匹配搜索关键字部分的字体设置为红色
        for (News news1 : newsList){
            news1.setTitle(news1.getTitle().replace(condition,"<font color='red'>"+condition+"</font>"));
        }

        List<Map<String,Object>> newsMapList = officeWebService.formatCreateTime(newsList,"yyyy-MM-dd");

        map.put("newsMapList",newsMapList);

        if (newsList1.size() <= OWConstant.OW_SHOW_LOADMORE_NUM){
            map.put("isShowLoadMore",0);//不显示"浏览更多"
        }else{
            map.put("isShowLoadMore",1);//显示
        }
        return JSON.toJSONString(map);
    }

    /**
     * 获取新的新闻列表(“浏览更多”功能),10条逐步增加
     */
    @RequestMapping("/loadMoreNews/{category}/{newsId}")
    @ResponseBody
    public String loadMoreNews(@PathVariable Long category,@PathVariable Long newsId){

        News news = newsService.selectById(newsId);
        HashMap<String,Object> map = new HashMap<>();
        List<Map<String,Object>> newsMapList;

        // 获取页面最后一条新闻之前的num条其他新闻（用时间比对）
        List<News> newsList = newsService.getNewsBeforeTimes(category,null,news.getCreateTime(),OWConstant.OW_SHOW_LOADMORE_NUM,false);

        // 获取页面最后一条新闻之前的所有其他新闻（用时间比对）
        List<News> newsList1 = newsService.getNewsBeforeTimes(category,null,news.getCreateTime(),null,false);

        //当类别为“政策法规”/"通知公告"/"行业资讯"时,时间格式为“yyyy-MM-dd”格式
        if (category == newsCategoryService.getIdByName(OWConstant.OW_ANOUNCEMENT) || category == newsCategoryService.getIdByName(OWConstant.OW_LAWS_REGULATIONS) || category==newsCategoryService.getIdByName(OWConstant.OW_PROFESSION_INFO)){
            newsMapList = officeWebService.formatCreateTime(newsList,"yyyy-MM-dd");
        }else{
            newsMapList = newsService.formatCreateTime(newsList);// 时间分拆为“年”和“月日”两部分
        }

        map.put("newsMapList",newsMapList);

        if (newsList1.size() <= OWConstant.OW_SHOW_LOADMORE_NUM){
            map.put("isShowLoadMore",0);//不显示"浏览更多"
        }else{
            map.put("isShowLoadMore",1);//显示
        }

        return JSON.toJSONString(map);
    }

}
